package main

import "fmt"

func main() {
	/*
		channel通道在使用时的注意点：
			1.用于 goroutine，传递消息的
			2.通道，每个都有相关联的数据类型
				nil chan，不能使用，类似于 nil map，不能直接存储键值对
			3.使用通道传递数据：<-
				chan <- data，发送数据到通道，向通道中写数据
				data <- chan，从通道中获取数据，从通道中读取数据
			4.阻塞：
				发送数据：chan <- data，阻塞的，直到另一条 goroutine，读取数据来解除阻塞
				读取数据：data <- chan，也是阻塞的，直到另一条 goroutine，写出数据解除阻塞
			5.本身 channel 就是同步的，意味着同一时间，只能有一条 goroutine 来操作

			6.如果 Goroutine 正在等待从通道接收数据。那么另一些 Goroutine 将会在该通道上写入数据，否则程序将会死锁

			注：通道是 goroutine 之间的连接，所以通道的发送和接收必须处在不同的 goroutine 中
	*/
	var ch1 chan bool
	ch1 = make(chan bool)

	go func() {
		for i := 0; i < 10; i++ {
			fmt.Println("子goroutine中，i: ", i)
		}
		//循环结束后，向通道中写数据，表示要结束了
		ch1 <- true
		fmt.Println("结束。。")
	}()

	data := <-ch1
	fmt.Println("main...data -->", data)
	fmt.Println("main...over")
}
